package cn.xscrum.vtsp.service.impl;

import java.util.List;

import cn.xscrum.common.exception.BusinessException;
import cn.xscrum.common.utils.DateUtils;
import cn.xscrum.common.utils.StringUtils;
import cn.xscrum.vtsp.domain.VtspAdviserManage;
import cn.xscrum.vtsp.domain.VtspMessage;
import cn.xscrum.vtsp.domain.VtspVolunteerActivity;
import cn.xscrum.vtsp.mapper.VtspPostMapper;
import cn.xscrum.vtsp.mapper.VtspVolunteerActivityMapper;
import cn.xscrum.vtsp.service.IVtspMessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.xscrum.vtsp.mapper.VtspActivityMapper;
import cn.xscrum.vtsp.domain.VtspActivity;
import cn.xscrum.vtsp.service.IVtspActivityService;
import cn.xscrum.common.core.text.Convert;

/**
 * 活动信息Service业务层处理
 *
 * @author xscrum
 * @date 2021-10-01
 */
@Service
public class VtspActivityServiceImpl implements IVtspActivityService
{
    @Autowired
    private VtspActivityMapper vtspActivityMapper;
    @Autowired
    private VtspPostMapper vtspPostMapper;
    @Autowired
    private VtspVolunteerActivityMapper vtspVolunteerActivityMapper;

    @Autowired
    private IVtspMessageService vtspMessageService;

    /**
	 * 查询活动信息
     *
     * @param activityId 活动信息ID
     * @return 活动信息
     */
    @Override
    public VtspActivity selectVtspActivityById(Long activityId)
    {
        return vtspActivityMapper.selectVtspActivityById(activityId);
    }
    @Override
    public VtspActivity selectVtspActivityByName(String activityName)
    {
        return vtspActivityMapper.selectVtspActivityByName(activityName);
    }


    /**
     * 查询活动列表
     *
     * @param activityId 活动
     * @return 活动集合
     */
    @Override
    public VtspActivity queryActivityList(Long activityId){
        return vtspActivityMapper.queryActivityList(activityId);
    }

    @Override
    public VtspActivity queryActivity(Long activityId){
        return vtspActivityMapper.queryActivity(activityId);
    };


    /**
	 * 查询活动信息列表
     *
     * @param vtspActivity 活动信息
     * @return 活动信息
     */
    @Override
    public List<VtspActivity> selectVtspActivityList(VtspActivity vtspActivity)
    {
        return vtspActivityMapper.selectVtspActivityList(vtspActivity);
    }

    /**
	 * 新增活动信息
     *
     * @param vtspActivity 活动信息
     * @return 结果
     */
    @Override
    public int insertVtspActivity(VtspActivity vtspActivity)
    {
        vtspActivity.setCreateTime(DateUtils.getNowDate());
        return vtspActivityMapper.insertVtspActivity(vtspActivity);
    }

    /**
	 * 修改活动信息
     *
     * @param vtspActivity 活动信息
     * @return 结果
     */
    @Override
    public int updateVtspActivity(VtspActivity vtspActivity)
    {
        vtspActivity.setUpdateTime(DateUtils.getNowDate());
        //对活动进行修改
        int row = vtspActivityMapper.updateVtspActivity(vtspActivity);
        //查询本次操作是否为结项
        VtspActivity activity = vtspActivityMapper.selectVtspActivityById(vtspActivity.getActivityId());
        //对项目结项执行发送消息到可视化工具    状态6 结项，userId-页面申请的连接id（对活动及活动类型进行更新）
        if (activity.getActivityState() == 6){
            vtspMessageService.sendMessage(6,null,7L);
        }else if (activity.getActivityState() == 2){
            //状态变化为2，则为发布活动
            VtspMessage message = new VtspMessage();
            //设置查找的消息的类别为活动邀请
            message.setMessageClassify(3);
            //标记是否查到
            boolean flag = true;
            //先查询该活动是否已经存在消息持久化消息，不存在则进行消息持久化
            List<VtspMessage> vtspMessages = vtspMessageService.selectVtspMessageList(message);
            //遍历查找是否存在消息上下文id为此次活动的id，如果不存在则进行操作
            for (VtspMessage vtspMessage : vtspMessages) {
                //如果找到了，变化状态（避免重复添加同一个活动的消息）
                if (vtspMessage.getBizId().equals(activity.getActivityId())){
                    flag = false;
                    break;
                }
            }
            //如果标记为真，表示没有发布过，则发布
            if (flag){
                //3-活动招募，传递上下文id，且设置消息的消费者为-1（全体消息）
                vtspMessageService.sendMessage(3, activity.getActivityId(), -1L);
                //4-活动邀请，传递上下文id，且设置消息的消费者为-1（全体消息）
                vtspMessageService.sendMessage(4, activity.getActivityId(), -1L);
            }
        }
        return row;
    }
    /**
	 * 删除活动信息对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteVtspActivityByIds(String ids)
    {
        //根据活动id删除志愿者关注的活动
        vtspVolunteerActivityMapper.deleteVtspVolunteerActivityById(Long.valueOf(ids));
        //根据活动id删除岗位
        vtspPostMapper.deleteVtspPostByActivityID(Long.valueOf(ids));
        return vtspActivityMapper.deleteVtspActivityByIds(Convert.toStrArray(ids));
    }

    /**
	 * 删除活动信息信息
     *
     * @param activityId 活动信息ID
     * @return 结果
     */
    @Override
    public int deleteVtspActivityById(Long activityId)
    {
        return vtspActivityMapper.deleteVtspActivityById(activityId);
    }

    @Override
    public String importList(List<VtspActivity> activityList)
    {
        //判空
        if (StringUtils.isNull(activityList) || activityList.size() == 0)
        {
            throw new BusinessException("导入数据不能为空！");
        }
        int successNum = 0;     //导入成功数量
        int failureNum = 0;     //导入失败数量
        StringBuilder successMsg = new StringBuilder();     //导入成功响应
        StringBuilder failureMsg = new StringBuilder();     //导入失败响应

        //对导入的数据进行循环判断
        for (VtspActivity vtspActivity : activityList)
        {
            //导入成功
            try
            {
                //插入
                this.insertVtspActivity(vtspActivity);
                successNum++;
                //导入成功提示
                successMsg.append("<br/>" + successNum + "活动信息导入成功！");
            }
            //导入失败
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/>" + failureNum + "活动信息导入失败！";
                failureMsg.append(msg + e.getMessage());
            }
        }
        //结果反馈
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new BusinessException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "数据已全部导入成功！共 " + successNum + " 条，数据如下：");
            //导入活动发起点，对导入活动执行发送消息到可视化工具    状态6，userId-页面申请的连接id（对活动及其他进行更新）
            vtspMessageService.sendMessage(6,null,7L);
        }
        return successMsg.toString();
    }
}
